package com.coze.lg.cozeagent.controller.oldtest;

import com.coze.lg.cozeagent.config.CozeConfig;
import com.coze.lg.cozeagent.controller.AipSpeech;
import com.coze.openapi.service.service.CozeAPI;

import javax.websocket.*;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

// 注解定义 WebSocket 端点（客户端连接地址：ws://localhost:8080/websocket）
@ServerEndpoint("/websocket")
public class socketWebsocket {
    private final CozeAPI cozeAPI;
    // 初始化一个AipSpeech
    private final AipSpeech aipSpeech;

    public socketWebsocket() {
        this.cozeAPI = new CozeConfig().cozeAPI();
        this.aipSpeech = new AipSpeech();
    }

    // 存储所有连接的客户端Session（线程安全的集合）
    private static final Set<Session> clientSessions =
            Collections.newSetFromMap(new ConcurrentHashMap<>());

    // 连接建立时触发
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("新连接建立：" + session.getId());
    }

    // 接收文本消息（支持大文本，框架自动处理分片）
    @OnMessage
    public void onTextMessage(Session session, String message) throws IOException {
        System.out.println("收到文本消息（长度：" + message.length() + "）：" + message);
        // 回复客户端（支持返回大文本）
        session.getBasicRemote().sendText("已收到文本，长度：" + message.length());
    }

    // 接收二进制消息（支持大文件/二进制数据）
    @OnMessage
    public void onBinaryMessage(Session session, byte[] binaryData) throws IOException {
        System.out.println("收到二进制数据（大小：" + binaryData.length + "字节）");
        // 回复客户端二进制确认
        // session.getBasicRemote().sendBinary(ByteBuffer.wrap("data".getBytes()));
        // do_read(binaryData);
        SessionWebsocket currentSession = new SessionWebsocket(aipSpeech, cozeAPI, session);
        currentSession.do_start(binaryData);
    }

    // 连接关闭时触发
    @OnClose
    public void onClose(Session session) {
        System.out.println("连接关闭：" + session.getId());
    }

    // 发生错误时触发
    @OnError
    public void onError(Session session, Throwable throwable) {
        throwable.printStackTrace();
    }

    // 向单个客户端发送消息
    private void sendMessageToClient(Session session, String message) throws IOException {
        // 判断连接是否仍然有效
        if (session.isOpen()) {
            // 发送文本消息（同步发送）
            session.getBasicRemote().sendBinary(ByteBuffer.wrap(message.getBytes(StandardCharsets.UTF_8)));
            // 也可以使用异步发送（不阻塞当前线程）
            // session.getAsyncRemote().sendText(message);
        }
    }
}
